/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import { ImportDeclaration } from 'ts-morph';
import { ITaskContext, ImportRewriteOptions } from '../..';

/**
 * 生成文件信息映射
 * 包含源文件到生成文件的完整映射关系
 */
export interface GeneratedFileInfo {
  sourceFilePath: string;         // 源文件绝对路径
  generatedFilePath: string;      // 生成文件绝对路径
  classNames: Set<string>;        // 该文件中包含的类名列表
}

/**
 * 导入重写服务接口
 */
export interface ImportRewriteService {
  /**
   * 重写项目中的导入语句
   * @param context 任务上下文 (ITaskContext)
   * @param generatedFileInfos 生成文件信息列表
   * @param options 导入重写选项
   */
  rewriteImports(
    context: ITaskContext,
    generatedFileInfos: GeneratedFileInfo[],
    options: ImportRewriteOptions
  ): void;
}

/**
 * 导入扫描策略接口
 */
export interface ImportScanStrategy {
  /**
   * 基于实际生成信息进行精确匹配
   * 只有实际生成了序列化代码的类才会被重写导入
   *
   * @param importDeclaration 导入声明
   * @param currentFilePath 当前文件路径
   * @param generatedFileInfos 生成文件信息列表
   * @param context 任务上下文，用于解析文件路径
   */
  shouldRewriteImport(
    importDeclaration: ImportDeclaration,
    currentFilePath: string,
    generatedFileInfos: GeneratedFileInfo[],
    context: ITaskContext
  ): GeneratedFileInfo | null;

  /**
   * 检查导出声明是否需要重写
   * 与导入检查逻辑相同
   *
   * @param moduleSpecifier 导出的模块说明符（from 子句的值）
   * @param currentFilePath 当前文件路径
   * @param generatedFileInfos 生成文件信息列表
   * @param context 任务上下文，用于解析文件路径
   */
  shouldRewriteExport(
    moduleSpecifier: string,
    currentFilePath: string,
    generatedFileInfos: GeneratedFileInfo[],
    context: ITaskContext
  ): GeneratedFileInfo | null;
}

/**
 * 导入转换服务接口
 */
export interface ImportTransformService {
  /**
   * 重写文件中的导入语句
   * @param filePath 文件路径
   * @param context 任务上下文
   * @param generatedFileInfos 生成文件信息列表
   * @param preserveOriginalImports 是否保留原导入注释
   */
  rewriteFileImports(
    filePath: string,
    context: ITaskContext,
    generatedFileInfos: GeneratedFileInfo[],
    preserveOriginalImports?: boolean
  ): void;
}
